home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xlock / hopalong.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  3KB  |  113 lines

  1. #ifndef lint
  2. static char sccsid[] = "@(#)hopalong.c    23.9 91/05/24 XLOCK";
  3. #endif
  4. /*-
  5.  * hopalong.c - Real Plane Fractals for xlock, the X Window System lockscreen.
  6.  *
  7.  * Copyright (c) 1991 by Patrick J. Naughton.
  8.  *
  9.  * See xlock.c for copying information.
  10.  *
  11.  * Revision History:
  12.  * 29-Oct-90: fix bad (int) cast.
  13.  * 29-Jul-90: support for multiple screens.
  14.  * 08-Jul-90: new timing and colors and new algorithm for fractals.
  15.  * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors.
  16.  * 08-Oct-89: Fixed long standing typo bug in RandomInitHop();
  17.  *          Fixed bug in memory allocation in inithop();
  18.  *          Moved seconds() to an extern.
  19.  *          Got rid of the % mod since .mod is slow on a sparc.
  20.  * 20-Sep-89: Lint.
  21.  * 31-Aug-88: Forked from xlock.c for modularity.
  22.  * 23-Mar-88: Coded HOPALONG routines from Scientific American Sept. 86 p. 14.
  23.  */
  24.  
  25. #include "xlock.h"
  26. #include <math.h>
  27.  
  28. typedef struct {
  29.     int         centerx;
  30.     int         centery;    /* center of the screen */
  31.     double      a;
  32.     double      b;
  33.     double      c;
  34.     double      i;
  35.     double      j;        /* hopalong parameters */
  36.     int         inc;
  37.     int         pix;
  38.     long        startTime;
  39. }           hopstruct;
  40.  
  41. static hopstruct hops[MAXSCREENS];
  42. static XPoint *pointBuffer = 0;    /* pointer for XDrawPoints */
  43.  
  44. #define TIMEOUT 30
  45.  
  46. void
  47. inithop(win)
  48.     Window      win;
  49. {
  50.     double      range;
  51.     XWindowAttributes xgwa;
  52.     hopstruct  *hp = &hops[screen];
  53.  
  54.  
  55.     XGetWindowAttributes(dsp, win, &xgwa);
  56.     hp->centerx = xgwa.width / 2;
  57.     hp->centery = xgwa.height / 2;
  58.     range = sqrt((double) hp->centerx * hp->centerx +
  59.          (double) hp->centery * hp->centery) /
  60.     (10.0 + random() % 10);
  61.  
  62.     hp->pix = 0;
  63.     hp->inc = (int) ((random() / MAXRAND) * 200) - 100;
  64.     hp->a = (random() / MAXRAND) * range - range / 2.0;
  65.     hp->b = (random() / MAXRAND) * range - range / 2.0;
  66.     hp->c = (random() / MAXRAND) * range - range / 2.0;
  67.     if (!(random() % 2))
  68.     hp->c = 0.0;
  69.  
  70.     hp->i = hp->j = 0.0;
  71.  
  72.     if (!pointBuffer)
  73.     pointBuffer = (XPoint *) malloc(batchcount * sizeof(XPoint));
  74.  
  75.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  76.     XFillRectangle(dsp, win, Scr[screen].gc, 0, 0,
  77.            hp->centerx * 2, hp->centery * 2);
  78.     XSetForeground(dsp, Scr[screen].gc, WhitePixel(dsp, screen));
  79.     hp->startTime = seconds();
  80. }
  81.  
  82.  
  83. void
  84. drawhop(win)
  85.     Window      win;
  86. {
  87.     double      oldj;
  88.     int         k = batchcount;
  89.     XPoint     *xp = pointBuffer;
  90.     hopstruct  *hp = &hops[screen];
  91.  
  92.     hp->inc++;
  93.     if (!mono && Scr[screen].npixels > 2) {
  94.     XSetForeground(dsp, Scr[screen].gc, Scr[screen].pixels[hp->pix]);
  95.     if (++hp->pix >= Scr[screen].npixels)
  96.         hp->pix = 0;
  97.     }
  98.     while (k--) {
  99.     oldj = hp->j;
  100.     hp->j = hp->a - hp->i;
  101.     hp->i = oldj + (hp->i < 0
  102.             ? sqrt(fabs(hp->b * (hp->i + hp->inc) - hp->c))
  103.             : -sqrt(fabs(hp->b * (hp->i + hp->inc) - hp->c)));
  104.     xp->x = hp->centerx + (int) (hp->i + hp->j);
  105.     xp->y = hp->centery - (int) (hp->i - hp->j);
  106.     xp++;
  107.     }
  108.     XDrawPoints(dsp, win, Scr[screen].gc,
  109.         pointBuffer, batchcount, CoordModeOrigin);
  110.     if (seconds() - hp->startTime > TIMEOUT)
  111.     inithop(win);
  112. }
  113.